/* Die Klasse Person repraesentiert eine Person aus dem realen Leben. 
 * Personen koennen fuer verschiedene Zwecke verwendet werden, wenn nur
 * die wichtigsten Daten zur Person erforderlich sind.
 * 
 * Datei: Person.java                  Autor:   Antonia Wagner 
 * Datum: 02.11.11                     Version: 0.2 
 * 
 * Historie: 02.11.11 v0.1 von Autor: Get- und Set-Methoden programmiert, 
 *                         Attribute gesetzt, toString()
 *           27.12.11 v0.2 Fehlermeldungen bei Falscheingabe des Namens
 *                         implementiert
 */

package personenverwaltung;

import java.io.Serializable;

import kommunikation.Parser.NamenParser;
import kommunikation.Parser.NichtImAlphabetAusnahme;
import GUI.Dashboard;
import basis.lokal.Lokalisierung;
import basis.lokal.Sprachen;

public class Person implements Serializable
{

  private static final long serialVersionUID = -8951360143052706226L;

  private String titel;
  private Anrede anrede;
  private String vorname;
  private String weitereVornamen;
  private String nachname;
  private Namenszusatz zusatz;
  private Lokalisierung lokal;


  /**
   * Erzeugt eine Person mit den folgenden Daten
   * 
   * @param name
   *          vorname der Person
   * @param nachname
   *          der Person
   */
  public Person (String name, String nachname)
  {
    /*
     * Sprache abfragen und speichern
     */
    Sprachen sprache = Dashboard.verwendeteSprache ();
    setzeSprache (sprache.toString ());

    /*
     * Daten speichern
     */
    setzeVorname (name);
    setzeNachname (nachname);
  }


  /**
   * 
   * @return vorname der Person
   */
  public String gibVornamen ()
  {
    return vorname;
  }


  /**
   * 
   * @return nachname der Person
   */
  public String gibNachname ()
  {
    return nachname;
  }


  /**
   * 
   * @return weitere Vornamen, die der Person zugeordnet sind
   */
  public String gibWeitereVornamen ()
  {
    return weitereVornamen;
  }


  /**
   * 
   * @return anrede, die zu dieser Person gespeichert ist
   */
  public Anrede gibAnrede ()
  {
    return anrede;
  }


  /**
   * 
   * @return den Zusatz, der zu dieser Person gespeichert ist
   */
  public Namenszusatz gibNamenszusatz ()
  {
    return zusatz;
  }


  /**
   * 
   * @return den Titel, der zu dieser Person gespeichert ist
   */
  public String gibTitel ()
  {
    return titel;
  }


  /**
   * 
   * @param name
   *          der zu dieser Person gespeichert werden soll
   */
  public void setzeVorname (String name)
  {
    String vorname = istGueltigerName (name);
    if (vorname != null)
    {
      this.vorname = vorname;
    }
    else
    {
      Benutzermeldung.fehlermeldungZeigen (
          lokal.gibUebersetzung ("Falscheingabe Name"),
          lokal.gibUebersetzung ("Fehler"));
    }
  }


  /**
   * 
   * @param nachname
   *          der zu dieser Person gespeichert werden soll
   */
  public void setzeNachname (String nachname)
  {
    String name = istGueltigerName (nachname);
    if (name != null)
    {
      this.nachname = name;
    }
    else
    {
      Benutzermeldung.fehlermeldungZeigen (
          lokal.gibUebersetzung ("Falscheingabe Name"),
          lokal.gibUebersetzung ("Fehler"));
    }
  }


  /**
   * 
   * @param titel
   *          der zu dieser Person gespeichert werden soll
   */
  public void setzeTitel (String titel)
  {
    this.titel = titel;
  }


  /**
   * 
   * @param anrede
   *          die zu dieser Person gespeichert werden soll
   */
  public void setzeAnrede (Anrede anrede)
  {
    this.anrede = anrede;
  }


  /**
   * 
   * @param weitereVornamen
   *          die zu dieser Person gespeichert werden sollen
   */
  public void setzeWeitereVornamen (String weitereVornamen)
  {
    String vornamen = istGueltigerName (weitereVornamen);
    if (vornamen != null)
    {
      this.weitereVornamen = vornamen;
    }
    else
    {
      Benutzermeldung.fehlermeldungZeigen (
          lokal.gibUebersetzung ("Falscheingabe Name"),
          lokal.gibUebersetzung ("Fehler"));
    }
  }


  /**
   * 
   * @param zusatz
   *          der zu dieser Person gespeichert werden soll
   */
  public void setzeZusatz (Namenszusatz zusatz)
  {
    this.zusatz = zusatz;
  }


  /**
   * @return saemtliche zu dieser Person gespeicherte Daten als String
   */
  public String toString ()
  {
    /*
     * Die Variable wert speichert das Gesamtergebnis, das
     * zurueckgegeben werden soll
     */
    String wert;

    /* Pruefen, ob die Person einen Titel hat und einfuegen, falls ja */
    if (! (titel == null))
    {
      wert = "Titel: " + titel.toString () + "\nAnrede: "
          + anrede.toString () + "\nVorname:" + vorname;
    }
    else
    {
      if (! (anrede == null))
      {
        wert = "Anrede: " + anrede.toString () + "\nVorname:" + vorname;
      }
      else
      {
        wert = "Vorname: " + vorname;
      }
    }

    /*
     * Pruefen, ob die Person weitere Vornamen hat und einfuegen, falls
     * ja
     */
    if (weitereVornamen == null)
    {
      wert += "\nNachname: " + nachname;
    }
    else
    {
      wert += "\nWeitere Vornamen: " + weitereVornamen + "\nNachname: "
          + nachname;
    }

    /*
     * Pruefen, ob ein Namenszusatz vorhanden ist und einfuegen, falls
     * ja
     */
    if (! (zusatz == null))
    {
      wert += "Zusatz: " + zusatz.toString ();
    }

    return wert;
  }


  /**
   * Erzeugt die fuer die Internationalisierung notwendige
   * Lokalisierungs-Klasse
   * 
   * @param sprache
   *          die verwendet werden soll
   */
  public void setzeSprache (String sprache)
  {
    lokal = new Sprachverwaltung (sprache).gibLokalisierung ();
  }


  /*
   * prueft, ob die Email ein gueltiges Format besitzt
   */
  protected String istGueltigerName (String zuPruefenderName)
  {
    NamenParser np = new NamenParser ();
    np.initialisieren (zuPruefenderName);
    /*
     * der Parser arbeitet solange bis sich die Maschine in eimem
     * Endzustand oder sich in einem Fehlerzustand befindet
     */
    while (!np.getAktuellenZusatnd ().istEndzustand ()
        && !np.istImFehlerzustand ())
    {
      /*
       * hier findet das Schrittweise ueberpruefen des Wortes statt
       */
      try
      {
        np.arbeiten ();
      }
      catch (NichtImAlphabetAusnahme ex)
      {
        Benutzermeldung.fehlermeldungZeigen (
            lokal.gibUebersetzung ("Falscheingabe Name"),
            lokal.gibUebersetzung ("Fehler"));
        return null;
      }
    }
    /*
     * wenn sich der Parser im Fehlerzustand befindet, wird null als
     * Ergebnis zurueckgegeben fuer nicht erkannt
     */
    if (np.istImFehlerzustand ())
    {
      return null;
    }
    /*
     * das Wort wurde erkannt und wird zurueckgegeben, um evtl
     * Tippfehler (Gross- / Kleinschreibung) zu korrigieren. Das erste
     * und letzte Zeichen werden weggeschnitten (ist jeweils ein
     * Leerzeichen, eine Eigenheit der implementiertten Turing-
     * Maschine)
     */
    String ergebnis = np.band.getBand ();
    ergebnis = ergebnis.substring (1, ergebnis.length () - 1);
    return ergebnis;
  }

}
